[WWDC18] Swift 4.2でSequenceに追加されたallSatisfyメソッドのご紹介 #WWDC18
本記事は Apple からベータ版として公開されているドキュメントを情報源としています。 そのため、正式版と異なる情報になる可能性があります。ご留意の上、お読みください。
はじめに
WWDC18のセッション、「What’s New in Swift」の中で、Swift 4.2で実装されたproposalの話が出てきました。今回はSwift 4.2でSequenceに追加されたallSatisfyメソッドをご紹介します。
検証環境
- macOS High Sierra 10.13.4
- Xcode Version 10.0 beta (10L176w)
シーケンスの全ての要素が条件を満たすかどうかを取得したい
Arrayなどのシーケンスで、「全ての要素が条件を満たすかどうか」を取得したい場合があります。
ここでは以下のようなIntのArrayがあり、「全ての要素が偶数かどうか」を取得したいとします。
let values = [2, 4, 6, 8]
これまで
これまではcontains
メソッドを使って条件を指定することで実現していました。
例えば、
let allElementsAreEven = !values.contains { !($0 % 2 == 0) }
や
let allElementsAreEven = !values.contains { $0 % 2 == 1 }
などの方法です。
Swift 4.2から
従来のcontains
を使った方法では!(否定)を使わざるを得ないため、可読性がよくありませんし、バグを生みやすい書き方でもあります。(特に否定が複数出てくるパターン...)
そこでSwift 4.2ではSequenceに新しくallSatisfy
メソッドが追加されました。
このメソッドを使うと以下のように書くことができます。
let allElementsAreEven = values.allSatisfy { $0 % 2 == 0 }
!(否定)が無くなり一目で何をやっているかわかるようになりましたね! これまでなかったのが不思議なくらいです。
ちなみにallSatisfy
メソッドのシグネチャは以下となっています。
func allSatisfy(_ predicate: (Self.Element) throws -> Bool) rethrows -> Bool
おわりに
今回はSwift 4.2でSequenceに追加されたallSatisfyメソッドをご紹介しました。 「全ての要素が条件を満たすかどうか」を取得する場合はこのメソッドを使用するようにしましょう。